/******************************************************************************
*@file  : acm32f42x_hal_msp.c
*@brief : HAL MSP module . not need header file 
******************************************************************************/
#include "hal.h"

void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
    /* 
      NOTE: This function can be modified by user.
    */

    GPIO_InitTypeDef    GPIO_Uart = {0};
    
    if (huart->Instance == UART1) 
    {
        /* Enable Clock */
        __HAL_RCC_UART1_CLK_ENABLE();
        __HAL_RCC_GPIOA_CLK_ENABLE();

        /* Initialization GPIO */
        GPIO_Uart.Pin       = GPIO_PIN_14 | GPIO_PIN_15;
        GPIO_Uart.Mode      = GPIO_MODE_AF_PP;
        GPIO_Uart.Pull      = GPIO_PULLUP;
        GPIO_Uart.Drive     = GPIO_DRIVE_LEVEL3;
        GPIO_Uart.Alternate = GPIO_FUNCTION_0;       
        HAL_GPIO_Init(GPIOA, &GPIO_Uart);

        /* NVIC Config */
        NVIC_ClearPendingIRQ(UART1_IRQn);
        NVIC_SetPriority(UART1_IRQn, 5);
        NVIC_EnableIRQ(UART1_IRQn);
    }
    else if (huart->Instance == UART2) 
    {
        /* Enable Clock */
        __HAL_RCC_UART2_CLK_ENABLE();
        __HAL_RCC_GPIOB_CLK_ENABLE();

        /* Initialization GPIO */
        GPIO_Uart.Pin       = GPIO_PIN_2 | GPIO_PIN_3;
        GPIO_Uart.Mode      = GPIO_MODE_AF_PP;
        GPIO_Uart.Pull      = GPIO_PULLUP;
        GPIO_Uart.Drive     = GPIO_DRIVE_LEVEL3;
        GPIO_Uart.Alternate = GPIO_FUNCTION_0;
        HAL_GPIO_Init(GPIOB, &GPIO_Uart);
        
        if (huart->Init.HwFlowCtl & UART_HWCONTROL_CTS) 
        {
            GPIO_Uart.Pin = GPIO_PIN_4;
            GPIO_Uart.Alternate = GPIO_FUNCTION_2;
            HAL_GPIO_Init(GPIOA, &GPIO_Uart);
        }

        if (huart->Init.HwFlowCtl & UART_HWCONTROL_RTS) 
        {
            GPIO_Uart.Pin = GPIO_PIN_9;
            GPIO_Uart.Alternate = GPIO_FUNCTION_2;
            HAL_GPIO_Init(GPIOA, &GPIO_Uart);
        }
        /* NVIC Config */
        NVIC_ClearPendingIRQ(UART2_IRQn);
        NVIC_SetPriority(UART2_IRQn, 5);
        NVIC_EnableIRQ(UART2_IRQn);
    }
}

void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c)
{    
    /* For Example */
    GPIO_InitTypeDef GPIO_Handle;     

    /* Enable Clock */
    __HAL_RCC_I2C1_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();

    GPIO_Handle.Pin            = GPIO_PIN_6;
    GPIO_Handle.Mode           = GPIO_MODE_AF_OD;
    GPIO_Handle.Pull           = GPIO_PULLUP;
    GPIO_Handle.Drive          = GPIO_DRIVE_LEVEL3;
    GPIO_Handle.Alternate      = GPIO_FUNCTION_0;
    HAL_GPIO_Init(GPIOA, &GPIO_Handle);

    GPIO_Handle.Pin            = GPIO_PIN_13;//GPIO_PIN_0;//GPIO_PIN_13;
    GPIO_Handle.Mode           = GPIO_MODE_AF_OD;
    GPIO_Handle.Pull           = GPIO_PULLUP;
    GPIO_Handle.Drive          = GPIO_DRIVE_LEVEL3;
    GPIO_Handle.Alternate      = GPIO_FUNCTION_1;//GPIO_FUNCTION_0;//GPIO_FUNCTION_1;
    HAL_GPIO_Init(GPIOB, &GPIO_Handle);

    /* Clear Pending Interrupt */
    NVIC_ClearPendingIRQ(I2C1_IRQn);

    /* Enable External Interrupt */
    NVIC_EnableIRQ(I2C1_IRQn);
    
    printfS("I2C PINs selected:\r\n");
    printfS("I2C SDA:PA6\r\n");
    printfS("I2C SCL:PB13\r\n\r\n");

}
